using System;
using System.IO;

namespace Handrise.BasicModal.Serialization.Interfaces
{
    /// <summary>
    /// Considering that System.Runtime.Formatters.IFormatter interface is not
    /// present in .NET Compact Framework, but we still wants to be "compatible"
    /// with BinaryFormatter behaviour (so people already familiar with Binary or
    /// SOAPFormatter can move to CompactFormatter with a small effort) we need
    /// to "clone" IFormatter interface, and this is ICFormatter.
    /// <remarks>Obviously we've left out Binder, Context and SurrogateSelector
    /// since they're useless in CF algorithm.</remarks>
    /// 
    /// </summary>
    public interface IOverrider
    {
        /// <summary>
        /// Serializes an object, or graph of objects with the given root 
        /// to the provided stream.
        /// </summary>
        /// <param name="serializationStream">The stream where the formatter 
        /// puts the serialized data. This stream can reference a variety of 
        /// backing stores (such as files, network, memory, and so on).
        /// </param>
        /// <param name="graph">The object, or root of the object graph, 
        /// to serialize. All child objects of this root object are 
        /// automatically serialized.</param>
        void Serialize(
            CompactFormatter parent,
            Stream serializationStream,
            object graph
            );

        /// <summary>
        /// Deserializes the data on the provided stream and reconstitutes the 
        /// graph of objects.
        /// </summary>
        /// <param name="serializationStream">The stream containing the data 
        /// to deserialize.</param>
        /// <returns>The top object of the deserialized graph.</returns>
        object Deserialize(
            CompactFormatter parent,
            Stream serializationStream
            );
    }
}
